package io.github.echarts.common.exception;

/**
 * 表示请求的操作在当前环境或配置下不支持。
 * 扩展了Java标准的UnsupportedOperationException，提供更多上下文信息。
 */
public class UnsupportedOperationException extends EchartsException {

    private static final long serialVersionUID = 1L;
    
    private final String operationName;
    private final String reason;
    private final String workaround;
    
    /**
     * 构造一个新UnsupportedOperationException，提供详细的上下文信息。
     *
     * @param operationName 不支持的操作名称
     * @param reason 不支持该操作的原因
     * @param workaround 可能的替代方法，如果没有则为null
     */
    public UnsupportedOperationException(String operationName, String reason, String workaround) {
        super(formatMessage(operationName, reason, workaround));
        this.operationName = operationName;
        this.reason = reason;
        this.workaround = workaround;
    }
    
    /**
     * 构造一个新UnsupportedOperationException，提供操作名称和原因。
     *
     * @param operationName 不支持的操作名称
     * @param reason 不支持该操作的原因
     */
    public UnsupportedOperationException(String operationName, String reason) {
        this(operationName, reason, null);
    }
    
    /**
     * 构造一个新UnsupportedOperationException，只提供操作名称。
     *
     * @param operationName 不支持的操作名称
     */
    public UnsupportedOperationException(String operationName) {
        this(operationName, "服务端渲染不支持此操作", null);
    }
    
    /**
     * 获取不支持的操作名称。
     *
     * @return 操作名称
     */
    public String getOperationName() {
        return operationName;
    }
    
    /**
     * 获取不支持该操作的原因。
     *
     * @return 原因
     */
    public String getReason() {
        return reason;
    }
    
    /**
     * 获取可能的替代方法。
     *
     * @return 替代方法，如果没有则为null
     */
    public String getWorkaround() {
        return workaround;
    }
    
    private static String formatMessage(String operationName, String reason, String workaround) {
        StringBuilder sb = new StringBuilder();
        sb.append("不支持的操作: ").append(operationName);
        
        if (reason != null && !reason.isEmpty()) {
            sb.append(", 原因: ").append(reason);
        }
        
        if (workaround != null && !workaround.isEmpty()) {
            sb.append(", 替代方法: ").append(workaround);
        }
        
        return sb.toString();
    }
} 